Skip to main content

06 EXTI

External Interrupt/Event Controller 外部中断/事件控制器

up的视频讲解: https://space.bilibili.com/1455872040

1 💫EXTI简介​

图片

EXTI(External Interrupt/Event Controller): 外部中断/事件控制器

  • 这里的事件和中断的区别在于 事件不会发给NVIC 所以就不会打断CPU的运行 但CPU可以主动读取它

  • 事件的作用往往是用于发出一个信号 用于外设和外设之间的配合 当然CPU也可以主动读取到这个信号

外部中断 与 内部中断
  • 外部中断/事件, 来自芯片的外部, 通过引脚输入

  • 内部中断/事件, 来自芯片内部, 通常由各外设发出

2 ➰️EXTI中断线​

图片

Input Line: 多个 GPIO 引脚通过 AFIO 模块的多路选择器(MUX), 由AFIO_EXTICR寄存器控制, 分时复用到同一条 EXTI 中断线上, 然后进入外部中断/事件控制器

图片

每个寄存器使用20位, 每一位对应一根外部中断线, 一共20根

  • 0-15:对应GPIO_PIN 0-15中断

  • 16:PVD输出

  • 17:RTC闹钟事件

  • 18:USB唤醒事件

  • 19:连接到以太网唤醒事件

EXTI 线 0~15:对应外部 IO 口使用的中断线只有 16 个,但是 STM32F1 的 IO 口 却远远不止 16 个

  • 所以 STM32 把 GPIO 管脚 GPIOx.0到GPIOx.15(x=A,B,C,D,E,F,G)通过AFIO寄存器映射到中断线 0~15

  • 以中断线线 EXTI0 为例:它对应了GPIOA.0、GPIOB.0、 GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0 和 GPIOG.0

  • 而中断线每次只能连接到 1 个 IO 口上, 这样就需要通过配置决定对应的中断线配置到哪个 GPIO 上了

3 🌐EXTI边缘检测电路​

图片

FTSR Falling trigger selection register(下降沿选择寄存器): 检测下降沿后, 产生一个脉冲信号(脉冲宽度为 1 个 PCLK2 周期)

RTSR Rising trigger selection register(上升沿选择寄存器)`: 检测到上升沿后, 产生一个脉冲信号

SWIER Software interrupt event register(软件中断事件寄存器): CPU 写该寄存器的对应位为 1, 即可强制产生一个中断 / 事件请求

这个边缘检测电路由上方的两个寄存器控制

  • 如果 Rising上升沿触发选择寄存器 置为1 那么就会打开边缘检测电路里的上升沿检测通路 此时 当检测到输入信号的 上升沿 的时候 就会输出一个脉冲信号

  • 如果 falling下降沿触发选择寄存器 置为1 那么就会打开下降沿检测通路 此时 当检测到输入信号的 下降沿 的时候 也就会产生一个脉冲信号

  • 还有一种情况是上升沿寄存器和下降沿寄存器 都置为1 此时上升沿和下降沿 的检测通路都打开 输入信号的上升沿 和下降沿都会 产生脉冲信号

所以说EXTI有三种触发方式 分别是 上升沿触发 下降沿触发 以及 上升沿和下降沿都触发

4 🗄️EXTI数字电路​

图片

PR Pending register(挂起请求寄存器): 该寄存器对应位置1, 表示中断请求已被挂起, 等待处理. 为 0时, 清除挂起状态

IMR Interrupt mask register(中断屏蔽寄存器): 若对应位为 0, 该中断请求会被屏蔽, 为 1 则允许

EMR Event mask register(事件屏蔽寄存器): 同上

或门(OR): 一个输入有效时, 或门就会输出高电平请求信号

与门(AND): 两个输入都有效, 或门才会输出高电平请求信号

Pulse generator(脉冲发生器): 将电平信号转换为一个单周期的脉冲信号

边缘检测电路的输出 以及上方软件中断或事件寄存器的输出都接到了 或门

  • 当边缘检测电路的脉冲信号 输入到或门的时候 这个输出信号也就是他本身

  • 同理 如果有 软件中断事件的脉冲 输入到或门的时候 输出信号也就是它本身

  • 如果两个脉冲信号同时进来呢 我们可以运算一下 高电平1加高电平1 或门的输出为高电平1 此时两个脉冲信号就会叠加为一个

与门-或门 的功能
  • 通过与门 就可以让一条路控制另一条路

  • 通过或门 就可以将原本两条路复用为一条路

图片

接下来再看到后面的 两个与门 首先看到上下两个寄存器 上面的是interrupt mask中断遮掩寄存器下面的是Event mask事件遮掩寄存器 它俩的作用就是 可以把这个脉冲信号遮掉 具体是怎么实现 的呢?

  • 当与门的一个输入为0的时候 与门都输出为0 也就相当于把另一个输入的信号遮掩掉

  • 当寄存器置为1的时候 1乘任何数都为它本身 就相当于放开这个遮掩 让信号过去

  • 对于下方事件的部分 还需要 通过Pluse generator 脉冲生成器 生成标准的事件信号

  • 对于上方中断部分 这个脉冲信号 会使得这个Pending挂起中断请求寄存器置位为1 向NVIC发出中断请求

tip

在进入中断之后 CPU需要清除这个中断标志位 也就是把这个Pending寄存器清零 以避免重复的触发中断

✅从引脚走到中断服务函数​

以PA0为例:GPIO输入 → AFIO选择EXTI0来源 → EXTI边沿检测与屏蔽 → NVIC → EXTI0_IRQHandler → HAL处理 → 用户回调。PA0与PB0共用EXTI0选择入口,不能同时作为两个独立的EXTI0来源。

EXTI5~9、EXTI10~15各共享IRQ入口,回调仍要根据GPIO_Pin区分来源。挂起位不等于引脚当前电平:边沿已经发生后,即使电平恢复了,事件仍可能待处理。

练习:分别配置上升沿、下降沿、双边沿,比较按下和松开时的回调次数;机械按键的多次触发还要与触点抖动区分。